// 静态方法
const strats = {};
const LIFECYCLE = [
  'beforeCreate',
  'created',
  'beforeMount',
  'mounted',
];
LIFECYCLE.forEach(hook => {
  strats[hook] = function (p, c) {
    if (c) {
      // 有新的
      if (p) {
        // 原来也有这个属性就合并
        return p.concat(c);
      } else {
        // 返回数组形式的
        return [c];
      }
    } else {
      // 没儿子就原样返回
      return p;
    }
  }
})
// 合并option和mixin
export function mergeOptions(parent, child) {
  const options = {};
  // 循环老的
  for (let key in parent) {
    mergenField(key);
  }
  // 循环新传进来的
  for (let key in child) {
    if (!parent.hasOwnProperty(key)) {
      mergenField(key);
    }
  }
  // 为key添加属性
  function mergenField(key) {
    // 策略模式减少if/else判断
    if (strats[key]) {
      // 命中声明周期了就用声明周期的合并
      options[key] = strats[key](parent[key], child[key]);
    } else {
      // 没有就直接合,优先用儿子,儿子没有用爹的
      options[key] = child[key] || parent[key];
    }
  }
  return options;
}

strats.components = function(parentVal,childVal){
  // 为了让组件能构建父子关系
  const res = Object.create(parentVal);
  if(childVal){
    for(let key in childVal){
      // 返回的是构造函数的对象,可以拿到父亲原型上的属性,并且将儿子都拷贝到子身上,就是个原型链
      res[key] = childVal[key];
    }
  }
  return res;
}